package pro.bbs.view.service;

import com.yy.pojo.bbs.TPost;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 调用论坛帖子相关远程服务接口
 * </p>
 * <描述>
 * Spring Cloud应用在启动时，Feign会扫描标有@FeignClient注解的接口，生成代理，并注册到Spring容器中。
 * 生成代理时Feign会为每个接口方法创建一个RequetTemplate对象，该对象封装了HTTP请求需要的全部信息，
 * 请求参数名、请求方法等信息都是在这个过程中确定的，Feign的模板化就体现在这里。
 * </描述>
 *
 * @author 杨阳
 * @since 2017年10月13日
 */
// @FeignClient(value = "bbs-server") 含义如下：
// 1. bbs-server为服务提供程序应用的名称， 即 bootstrap.properties中 spring.application.name=bbs-server
// 2. 并且选择程序，这是一个远程调用接口，不需要实现，只有接口即可注入
@FeignClient(value = "bbs-server", fallback = TPostRemoteServiceFallBack.class)
// 如果服务端controller上面加了@RequestMapping("/post")，那么这里一样加上
@RequestMapping("/post")
public interface TPostRemoteService {

    /**
     * <p>
     * 表示调用此方法，即可调用服务提供方的/getAllPosts服务
     * /getAllPosts 必须与服务提供方保持一至
     * </p>
     *
     * @param params 包含参数：
     *               page     当前页
     *               limit    每页显示记录数
     *               title    查询标题
     *               content  查询内容
     * @return {@link String}
     */
    @RequestMapping(value = "/getAllPosts", method = RequestMethod.POST)
    @ApiOperation(
            value = "远程服务，调用服务端/getAllPosts获得帖子列表"
    )
    List<TPost> getAllPosts(@RequestParam(value = "params") Map<String, Object> params);

}

/**
 * <p>
 * feign使用断路器，
 * 失败回退类必须使用feign接口，TPostRemoteServiceFallBack也可以是public class，
 * 这里是图方便，直接写在一个文件中，因为一个文件只保存存在一个public 修饰的类
 * </p>
 *
 * @author 杨阳
 * @since 2017年11月3日
 */
class TPostRemoteServiceFallBack implements TPostRemoteService {

    @Override
    public List<TPost> getAllPosts(Map<String, Object> params) {
        List<TPost> list = new ArrayList<TPost>();
        return list;
    }
}